/*
 * @Author: 悦者生存 1002783067@qq.com
 * @Date: 2023-02-25 19:10:35
 * @LastEditors: 悦者生存 1002783067@qq.com
 * @LastEditTime: 2023-10-29 12:23:15
 * @FilePath: /koa2-ts-template/src/core/Init.ts
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
import Koa from 'koa';
import koaBodyParser from 'koa-body';
import koaStatic from 'koa-static';
import path from 'path';
import cors from 'koa2-cors';
import koaJwt from 'koa-jwt';
import Config from '../config/config.default';
import { catchError } from '../middlewares/catchError';
import { view } from '../middlewares/view';
import { responseBody } from '../middlewares/responseBody';
import { model } from '../middlewares/model';
import router from '../routes';

class Init {
  public static app: Koa;
  public static initCore(app: Koa) {
    Init.app = app;
    Init.loadBodyParser();
    Init.initCatchError();
    Init.initHtmlTemplate();
    Init.initStaticFile();
    Init.initCors();
    Init.initJwt();
    Init.initModel();
    Init.initResponseBody();
    Init.initLoadRouters();
  }

  static initJwt() {
    Init.app.use(
      koaJwt({
        secret: Config.JWT.secret,
      }).unless({
        path: Config.JWT.ignore,
      })
    );
  }

  static loadBodyParser() {
    Init.app.use(
      koaBodyParser({
        multipart: true,
      })
    );
  }

  static async initLoadRouters() {
    Init.app.use(router.routes());
    Init.app.use(router.allowedMethods());
  }

  // 错误监听和日志处理
  static initCatchError() {
    Init.app.use(catchError);
  }

  // 加载模板
  static initHtmlTemplate() {
    Init.app.use(view(path.join(__dirname, '../views')));
  }

  // 加载静态文件
  static initStaticFile() {
    Init.app.use(koaStatic(path.join(__dirname, '../public')));
  }

  // 跨域请求
  static initCors() {
    Init.app.use(cors());
  }

  // 在ctx上挂载success，fail，简化ctx.body
  static initResponseBody() {
    Init.app.use(responseBody());
  }

  // 在ctx上挂载model
  static initModel() {
    Init.app.use(model());
  }
}

export default Init.initCore;
